package com.opengate.base.utils;

import com.opengate.base.servlet.BufferedServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description 获取请求参数
 * @date 2023/4/26 5:46 PM
 */
@Slf4j
public class RequestUtil {

    /** 请求参数中的json数据key */
    public static final String REQ_OBJECT_DATA_KEY = "objectData";

    /**
     * 获取请求参数
     *
     * @param request 请求
     * @return 请求参数
     */
    public static Map<String, String> getParameterMap(HttpServletRequest request) {

        // 初始化返回值
        Map<String, String> result = new HashMap<>();

        // 提取普通参数
        Enumeration<String> enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String paraName = enu.nextElement();
            result.put(paraName, request.getParameter(paraName));
        }

        // 提取json格式数据
        try {
            // 文件格式数据不处理
            if (request instanceof BufferedServletRequestWrapper) {
                BufferedServletRequestWrapper requestWrapper =
                        (BufferedServletRequestWrapper) request;
                String jsonStr = getRequestObjStr(requestWrapper);
                if (StringUtils.isNotEmpty(jsonStr)) {
                    result.put(REQ_OBJECT_DATA_KEY, jsonStr);
                }
            }
        } catch (Exception e) {
            log.debug("参数提取出错，不影响流程，原因：", e);
        }

        return result;
    }

    /** 读取request中的对象型数据，json格式，一般为@RequestBody注解参数 */
    private static String getRequestObjStr(BufferedServletRequestWrapper request) {
        int contentLength = request.getContentLength();
        if (contentLength < 0) {
            return null;
        }
        return request.getBody();
    }
}
